package org.sprogram.utils
{
	import flash.utils.ByteArray;

	public class ByteArrayUtil
	{
//		http://blog.csdn.net/honeycat/article/details/9166079
//		AS3 ByteArray解压C++ zlib一点注意事项  
//			分类： 游戏编程  2013-06-24 23:00 610人阅读 评论(0) 收藏 举报 
//		压缩ActionScriptC++bytearray行业数据
//		AS3的ByteArray中有压缩函数compress和解压缩的函数uncompress，刚好对应C++的zlib普通方式compress和uncompress，当然compress2也是可以的。
//		有点需要注意的事在C++ zlib压缩后的数据写文件后，文件体积比实际数据大了几字节，然后AS3中解压的时候就出错了。
//		发现是在C++中写文件的时候fopen函数打开文件的时候用的"w"而不是"wb"，打开文件要用二进制方式。
//		在AS3中可以用loader加载或者用writeUFTBytes写进ByteArray都可以的。position=0后就可以uncompress了。

		/** 
		 * 把 ByteArray 转换为 16 进制。 
		 * 格式为 "BB BB BB BB BB BB BB BB|BB BB..."，"BB" 表示一个字节。 * 
		 * @param bytes ByteArray 
		 * @return 把 ByteArray 转换为16 进制后的字符串。
		 */ 
		public static function toHex(bytes:ByteArray):String {
			var pos:int = bytes.position; 
			bytes.position = 0; 
			var result:String = "\n*"+ bytes.length+"\n"; 
			while(bytes.bytesAvailable >= 8) 
			{ 
				result += toHexNum(bytes.readUnsignedByte()) + " " + 
					toHexNum(bytes.readUnsignedByte()) + " " + 
					toHexNum(bytes.readUnsignedByte()) + " " + 
					toHexNum(bytes.readUnsignedByte()) + " " + 
					toHexNum(bytes.readUnsignedByte()) + " " + 
					toHexNum(bytes.readUnsignedByte()) + " " + 
					toHexNum(bytes.readUnsignedByte()) + " " + 
					toHexNum(bytes.readUnsignedByte()) + "|\n"; 
			} 
			while(bytes.bytesAvailable>1) 
			{
				result += toHexNum(bytes.readUnsignedByte()) + " ";
			} 
			if(bytes.bytesAvailable) 
			{ 
				result += toHexNum(bytes.readUnsignedByte()); 
			} 
			result += "*\n"; 
			bytes.position = pos; 
			return result; 
		}
		/** 
		 * @private
		 * 把 1 个字节转换为 16 进制的字符串。 
		 * @param n 1 个字节。 
		 * @return 16 进制的字符串。 
		 */ 
		private static function toHexNum(n:uint):String 
		{ 
			return n <= 0xF ? "0" + n.toString(16) : n.toString(16); 
		}
	}
}